home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Developer Essentials / DTS Sample Code / System 7.0 Samples / Kibitz / Config.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-21  |  10.1 KB  |  421 lines  |  [TEXT/MPS ]

  1. /*
  2. ** Apple Macintosh Developer Technical Support
  3. **
  4. ** Program:     Kibitz
  5. ** File:        config.c
  6. ** Written by:  Eric Soldan
  7. **
  8. ** Copyright © 1990-1991 Apple Computer, Inc.
  9. ** All rights reserved.
  10. */
  11.  
  12.  
  13.  
  14. /*****************************************************************************/
  15.  
  16.  
  17.  
  18. #include "Kibitz.h"                /* Get the Kibitz includes/typedefs, etc.    */
  19. #include "KibitzCommon.h"        /* Get the stuff in common with rez.        */
  20. #include "Kibitz.protos"        /* Get the prototypes for Kibitz.            */
  21.  
  22. #ifndef __RESOURCES__
  23. #include <Resources.h>
  24. #endif
  25.  
  26. #ifndef __TOOLUTILS__
  27. #include <ToolUtils.h>
  28. #endif
  29.  
  30. #ifndef __UTILITIES__
  31. #include <Utilities.h>
  32. #endif
  33.  
  34.  
  35.  
  36. /*****************************************************************************/
  37.  
  38.  
  39.  
  40. #define kConfigOK        1
  41. #define kConfigEquivs    2
  42. #define kConfigCancel    3
  43. #define kPlayWhite        4
  44. #define kPlayBlack        5
  45. #define kCompWhite        6
  46. #define kCompBlack        7
  47. #define kTimerToggle    8
  48. #define kDivider1        9
  49. #define kDivider2        10
  50. #define kDivider3        11
  51. #define kWhiteClock        12
  52. #define kBlackClock        13
  53. #define kStatText1        14
  54. #define kStatText2        15
  55. #define kStatText3        16
  56. #define kStatText4        17
  57. #define kStatText5        18
  58.  
  59.  
  60.  
  61. /*****************************************************************************/
  62.  
  63.  
  64.  
  65. static TheDoc    newConfig;
  66. static short    iconNum[3] = {rConfigBase, rConfigBase + 1, rConfigBase + 2};
  67.  
  68. pascal void        DoConfigureGameProc(DialogPtr dialog, short userItem);
  69.  
  70.  
  71.  
  72. /*****************************************************************************/
  73. /*****************************************************************************/
  74.  
  75.  
  76.  
  77. #pragma segment Config
  78. void    DoConfigureGame(FileRecHndl frHndl)
  79. {
  80.     WindowPtr        oldPort;
  81.     DialogPtr        dialog;
  82.     short            item, userItemType, i, val, part;
  83.     Handle            itemHndl;
  84.     Rect            userItemRect;
  85.     AEAddressDesc    locOfOpponent;
  86.     Str255            zone, machine, application, userName;
  87.     Point            mouseLoc;
  88.     unsigned long    tick;
  89.     long            defaultTime, defaultMinutes;
  90.     Boolean            colorChange, timeChange;
  91.     TheDocPtr        docPtr;
  92.  
  93.     oldPort = SetFilePort(frHndl);
  94.  
  95.     newConfig = (*frHndl)->doc;
  96.         /* So DoConfigureGameProc can know, too.  This also allows us to cancel,
  97.         ** without changes. */
  98.  
  99.     zone[0] = machine[0] = userName[0] = 0;
  100.     colorChange = timeChange = 0;
  101.  
  102.     if (dialog = GetCenteredDialog(rConfigureGame, nil, nil, (WindowPtr)-1L)) {
  103.  
  104.         for (item = kPlayWhite; item <= kStatText5; ++item) {
  105.             GetDItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  106.             val = 0;
  107.             switch (item) {
  108.                 case kPlayWhite:
  109.                 case kPlayBlack:
  110.                     if ((newConfig.myColor) == item - kPlayWhite) ++val;
  111.                     break;
  112.                 case kCompWhite:
  113.                     if (newConfig.compMovesWhite) ++val;
  114.                     break;
  115.                 case kCompBlack:
  116.                     if (newConfig.compMovesBlack) ++val;
  117.                     break;
  118.                 case kTimerToggle:
  119.                     if (newConfig.timeLeft[0] != -1) ++val;
  120.                     break;
  121.                 case kDivider1:
  122.                 case kDivider2:
  123.                 case kDivider3:
  124.                 case kWhiteClock:
  125.                 case kBlackClock:
  126.                     itemHndl = (Handle)DoConfigureGameProc;
  127.                     SetDItem(dialog, item, userItemType, itemHndl, &userItemRect);
  128.                     break;
  129.                 case kStatText3:
  130.                     if (newConfig.twoPlayer) {
  131.                         locOfOpponent = newConfig.locOfOpponent;
  132.                         if (!GetTargetInfo(locOfOpponent, zone, machine, application))
  133.                             pstrcpy(userName, &newConfig.opponentName[0]);
  134.                     }
  135.                     break;
  136.             }
  137.  
  138.             if (val) SetCtlValue((ControlHandle)itemHndl, val);
  139.         }
  140.  
  141.         ParamText(zone, machine, userName, nil);
  142.  
  143.         OutlineDialogItem(dialog, kConfigOK);
  144.         for (;;) {
  145.  
  146.             SetPort(dialog);
  147.             ModalDialog((ModalFilterProcPtr)configFilter, &item);
  148.  
  149.             if (item == kConfigOK) {
  150.  
  151.                 docPtr = &((*frHndl)->doc);
  152.                 docPtr->compMovesWhite = newConfig.compMovesWhite;
  153.                 docPtr->compMovesBlack = newConfig.compMovesBlack;
  154.                     /* This is between us and us. */
  155.  
  156.                 if (timeChange) {
  157.                     for (i = 0; i < 2; ++i) {
  158.                         docPtr->displayTime[i] = newConfig.defaultTime[i];
  159.                         docPtr->defaultTime[i] = newConfig.defaultTime[i];
  160.                         docPtr->timeLeft[i]    = newConfig.timeLeft[i];
  161.                     }
  162.                     UpdateGameStatus(frHndl);
  163.                     SendMssg(frHndl, kTimeMssg);
  164.                     DrawTime(frHndl);
  165.                 }
  166.  
  167.                 if (colorChange)
  168.                     SendMssg(frHndl, newConfig.myColor);
  169.  
  170.                 break;
  171.             }
  172.  
  173.             if (item == kConfigCancel) break;
  174.  
  175.             GetDItem(dialog, item, &userItemType, &itemHndl, &userItemRect);
  176.             switch (item) {
  177.                 case kPlayWhite:
  178.                 case kPlayBlack:
  179.                     if (!GetCtlValue((ControlHandle)itemHndl)) {
  180.                         colorChange = true;
  181.                         SetCtlValue((ControlHandle)itemHndl, true);
  182.                         GetDItem(dialog, (kPlayWhite + kPlayBlack) - item,
  183.                                  &userItemType, &itemHndl, &userItemRect);
  184.                         SetCtlValue((ControlHandle)itemHndl, false);
  185.                         newConfig.myColor ^= 1;
  186.                     }
  187.                     break;
  188.                 case kCompWhite:
  189.                 case kCompBlack:
  190.                     val = (GetCtlValue((ControlHandle)itemHndl) ^ 1);
  191.                     SetCtlValue((ControlHandle)itemHndl, val);
  192.                     if (item == kCompWhite)
  193.                         newConfig.compMovesWhite = val;
  194.                     else
  195.                         newConfig.compMovesBlack = val;
  196.                     break;
  197.                 case kTimerToggle:
  198.                     timeChange = true;
  199.                     val = (GetCtlValue((ControlHandle)itemHndl) ^ 1);
  200.                     SetCtlValue((ControlHandle)itemHndl, val);
  201.                     if (val) {
  202.                         for (i = 0; i < 2; ++i)
  203.                             newConfig.timeLeft[i] = newConfig.displayTime[i] =
  204.                                 newConfig.defaultTime[i];
  205.                     }
  206.                     else {
  207.                         for (i = 0; i < 2; ++i)
  208.                             newConfig.timeLeft[i] = -1;
  209.                     }                        
  210.                     for (item = kWhiteClock; item <= kBlackClock; ++item)
  211.                         DoConfigureGameProc(dialog, item);
  212.                     break;
  213.                 case kWhiteClock:
  214.                 case kBlackClock:
  215.                     if (newConfig.timeLeft[0] == -1) break;
  216.  
  217.                     userItemRect.right  -= 2;
  218.                     userItemRect.bottom -= 2;
  219.                         /* Don't include the drop shadow in hit area. */
  220.  
  221.                     part = 0;
  222.                     tick = TickCount();
  223.  
  224.                     GetMouse(&mouseLoc);
  225.                     if (PtInRect(mouseLoc, &userItemRect)) {
  226.                         if (mouseLoc.h < userItemRect.left + 16) {
  227.                             userItemRect.right = userItemRect.left + 16;
  228.                             part = 1;
  229.                         }
  230.                         else {
  231.                             if (mouseLoc.h > userItemRect.right - 16) {
  232.                                 userItemRect.left = userItemRect.right - 16;
  233.                                 part = 3;
  234.                             }
  235.                         }
  236.                         if (part) {
  237.                             if (mouseLoc.v > userItemRect.top + 12) {
  238.                                 ++part;
  239.                                 userItemRect.top += 12;
  240.                             }
  241.                             else
  242.                                 userItemRect.bottom = userItemRect.top + 12;
  243.                         }
  244.                     }
  245.  
  246.                     do {
  247.                         GetMouse(&mouseLoc);
  248.                         if (PtInRect(mouseLoc, &userItemRect)) {
  249.                             if (part) {
  250.                                 timeChange = true;
  251.                                 defaultTime = newConfig.defaultTime[item - kWhiteClock];
  252.                                 if (part >= 3) {
  253.                                     defaultMinutes = defaultTime;
  254.                                     defaultTime /= 216000L;
  255.                                     defaultTime *= 216000L;
  256.                                     defaultMinutes -= defaultTime;
  257.                                 }
  258.                             }
  259.                             switch (part) {
  260.                                 case 1:
  261.                                     iconNum[0] = rConfigBase + 3;
  262.                                     defaultTime += 216000L;
  263.                                     if (defaultTime >= (216000L * 4))
  264.                                         defaultTime -= (216000L * 4);
  265.                                     if (!defaultTime)
  266.                                         defaultTime = 216000L;
  267.                                     break;
  268.                                 case 2:
  269.                                     iconNum[0] = rConfigBase + 4;
  270.                                     defaultTime -= 216000L;
  271.                                     if (defaultTime < 0)
  272.                                         defaultTime += (216000L * 4);
  273.                                     if (!defaultTime)
  274.                                         defaultTime = (216000L * 3);
  275.                                     break;
  276.                                 case 3:
  277.                                     iconNum[2] = rConfigBase + 5;
  278.                                     defaultMinutes += 3600;
  279.                                     if (defaultMinutes >= 216000L)
  280.                                         defaultMinutes -= 216000L;
  281.                                     defaultTime += defaultMinutes;
  282.                                     if (!defaultTime)
  283.                                         defaultTime = 3600;
  284.                                     break;
  285.                                 case 4:
  286.                                     iconNum[2] = rConfigBase + 6;
  287.                                     defaultMinutes -= 3600;
  288.                                     if (defaultMinutes < 0)
  289.                                         defaultMinutes += 216000L;
  290.                                     defaultTime += defaultMinutes;
  291.                                     if (!defaultTime)
  292.                                         defaultTime = (216000L - 3600);
  293.                                     break;
  294.                             }
  295.                         }
  296.                         if (part) {
  297.                             newConfig.defaultTime[item - kWhiteClock] = defaultTime;
  298.                             for (i = 0; i < 2; ++i)
  299.                                 newConfig.timeLeft[i] = newConfig.displayTime[i] =
  300.                                     newConfig.defaultTime[i];
  301.                             DoConfigureGameProc(dialog, item);
  302.                             iconNum[0] = rConfigBase;
  303.                             iconNum[2] = rConfigBase + 2;
  304.                         }
  305.  
  306.                         while ((StillDown()) && (tick + 30 > TickCount()));
  307.                         tick += 3;
  308.  
  309.                     } while (StillDown());
  310.  
  311.                     DoConfigureGameProc(dialog, item);
  312.                     break;
  313.             }
  314.         }
  315.         DisposDialog(dialog);
  316.     }
  317.  
  318.     SetPort(oldPort);
  319. }
  320.  
  321.  
  322.  
  323. /*****************************************************************************/
  324.  
  325.  
  326.  
  327. #pragma segment Config
  328. pascal void    DoConfigureGameProc(DialogPtr dialog, short userItem)
  329. {
  330.     short            userItemType;
  331.     Handle            userProc;
  332.     Rect            userItemRect;
  333.     Rect            clockRect;
  334.     short            i, time[3];
  335.     unsigned long    defaultTime;
  336.     Handle            clockPart;
  337.     RgnHandle        oldClip, newClip, textClip;
  338.     char            pstr[6];
  339.     Boolean            timed;
  340.  
  341.     GetDItem(dialog, userItem, &userItemType, &userProc, &userItemRect);
  342.     if (userItem < kWhiteClock) {
  343.         PenPat(qd.gray);
  344.         FrameRect(&userItemRect);
  345.         PenNormal();
  346.     }
  347.     else {
  348.         timed = (newConfig.timeLeft[0] != -1);
  349.  
  350.         oldClip = NewRgn();
  351.         GetClip(oldClip);
  352.         newClip = NewRgn();
  353.         RectRgn(newClip, &userItemRect);
  354.         SetRectRgn(textClip = NewRgn(),
  355.             userItemRect.left   + 16,
  356.             userItemRect.top    + 2,
  357.             userItemRect.right  - 19,
  358.             userItemRect.bottom - 4);
  359.         if (timed) DiffRgn(newClip, textClip, newClip);
  360.         SetClip(newClip);
  361.  
  362.         clockRect = userItemRect;
  363.         clockRect.right  = clockRect.left + 32;
  364.         clockRect.bottom = clockRect.top  + 32;
  365.         for (i = 0; i < 3; ++i) {
  366.             if (clockPart = GetResource('ICN#', iconNum[i]))
  367.                 PlotIcon(&clockRect, clockPart);
  368.             OffsetRect(&clockRect, 24, 0);
  369.         }
  370.  
  371.         if (timed) {
  372.             SetClip(textClip);
  373.             TextMode(srcCopy);
  374.             defaultTime = newConfig.defaultTime[userItem - kWhiteClock];
  375.             for (i = 3; i;) {
  376.                 defaultTime /= 60;
  377.                 time[--i] = defaultTime % 60;
  378.             }
  379.             for (i = 0; i < 2; ++i) {
  380.                 MoveTo(userItemRect.left + 21 + 20 * i, userItemRect.top + 15);
  381.                 i2pstr(pstr, time[i]);
  382.                 if (pstr[0] == 1) DrawChar('0');
  383.                 DrawString(pstr);
  384.                 DrawChar(": "[i]);
  385.             }
  386.             TextMode(srcOr);
  387.         }
  388.  
  389.         SetClip(oldClip);
  390.         DisposeRgn(oldClip);
  391.         DisposeRgn(newClip);
  392.         DisposeRgn(textClip);
  393.     }
  394. }
  395.  
  396.  
  397.  
  398. /*****************************************************************************/
  399.  
  400.  
  401.  
  402. #pragma segment Config
  403. pascal Boolean    configFilter(DialogPtr dlg, EventRecord *event, short *item)
  404. {
  405.     static unsigned long    lastIdle;
  406.  
  407.     if (keyEquivFilter(dlg, event, item))
  408.         return(true);
  409.  
  410.     if (lastIdle + 30 < TickCount()) {
  411.         lastIdle = TickCount();
  412.         DoIdleTasks(false);
  413.         SetPort(dlg);
  414.     }
  415.  
  416.     return(false);
  417. }
  418.  
  419.  
  420.  
  421.